//
//  Status.swift
//  weibo
//
//  Created by sanya on 15/6/30.
//  Copyright © 2015年 sanya. All rights reserved.
//

import UIKit
import SDWebImage
/// 访问微博首页 URL
private let WB_Home_Timeline_URL = "2/statuses/home_timeline.json"
class Status: NSObject {
    // MARK: - 数据模型属性
    /// 微博创建时间
    var created_at: String?
    /// 微博ID
    var id: Int = 0
    /// 微博信息内容
    var text: String?
    /// 微博来源
    var source: String?
    /// 配图数组
    var pic_urls: [[String: String]]?{
        didSet {
            // 设置 imageURLs 的数组
            imageURLs = [NSURL]()
            largeImageURLs = [NSURL]()
            
            
            // 生成并且添加 url
            for dict in pic_urls! {
                var urlString = dict["thumbnail_pic"]!
                // 缩略图URL
                imageURLs?.append(NSURL(string: urlString)!)
                // 大图URL
                urlString = urlString.stringByReplacingOccurrencesOfString("thumbnail", withString: "large")
                largeImageURLs?.append(NSURL(string: urlString)!)
            }
        }
    }
    /// 配图的url 数组
    private var imageURLs:[NSURL]?
    /// 计算型属性，配图的 URL 数组
    /// 如果是转发微博，只需要缓存转发微博的 imageURLs，原创的 imageURLs 是 nil
    /// 如果是原创微博，imageURLs 可能有内容
    var picURLs:[NSURL]? {
        return retweeted_status != nil ? retweeted_status?.imageURLs : imageURLs
    }
    /// 大图的 URL 数组
    private var largeImageURLs:[NSURL]?
    var largePicURLs:[NSURL]? {
        return retweeted_status != nil ?retweeted_status?.largeImageURLs : largeImageURLs
    }
    
    
    /// 被转发的原微博信息字段，当该微博为转发微博时返回
    var retweeted_status: Status?
    /// 用户模型
    var user:Users?
    /// 类属性数组
    static let properties = ["created_at", "id", "text", "source", "pic_urls","user","retweeted_status"];
    
    /// 字典转模型函数
    init(dict: [String: AnyObject]){
        super.init()
        for key in Status.properties{
            // 判断属性字典中的key对应的值是否存在, 及key是否为user
            if dict[key] == nil || key == "user" || key == "retweeted_status"{
                continue
            }
            // 如果存在，使用 KVC 设置数值 使用之前，需要调用super.init() 初始化对象属性
            setValue(dict[key], forKey: key)
        }
        // 转发微博
        if let retweetedDict = dict["retweeted_status"] as? [String:AnyObject]{
           retweeted_status = Status(dict: retweetedDict)

        }
        if let userDict = dict["user"] as? [String:AnyObject]{
            // 给 user 属性设置数值
           user = Users(dict: userDict)
        }
    }
    
    /// 输出
    override var description: String {
        let dict = dictionaryWithValuesForKeys(Status.properties)
        return "\(dict)"
    }
    
    /// 加载数据
    /**
    since_id    若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0
    max_id      若指定此参数，则返回ID小于或等于max_id的微博，默认为0
    */
    class func loadStatus(since_id:Int,max_id:Int,finished:(statuses:[Status]?,error:NSError?)->()) {
        assert(sharedUserAccount != nil, "必须登录之后才能访问网络")
        
        var params = ["access_token":sharedUserAccount!.access_token]
        if since_id > 0 {
                params["since_id"] = "\(since_id)"
        }
        if max_id > 0 {
            params["since_id"] = "0"
            params["max_id"] = "\(max_id - 1)"
        }
        // 发起网络请求，异步加载数据
        NetworkTools.shareNetworkTools().GET(WB_Home_Timeline_URL, parameters: params, success: { (_, JSON) -> Void in
            
          
            // 从结果中回去微博的模型数据
            if let array = JSON["statuses"] as? [[String: AnyObject]]{
                // array 就是拿到的微博数据，转换成Status模型返回
                let list = statuses(array)
                cacheWebImages(list, finished: finished)
            }
            
            finished(statuses: nil, error: nil)
            
            }) { (_, error) -> Void in
                print(error)
                finished(statuses: nil, error: error)
        }
    }
    /// 缓存微博数组中的所有图像
    private class func cacheWebImages(list:[Status],finished:(statuses:[Status]?,error:NSError?)->()){
        // 0. 定义调度组
        let group = dispatch_group_create()
        // 遍历数组
        for s in list{
            // 2.判断 picURLs 是否有内容
            if s.picURLs == nil || s.picURLs!.isEmpty{
                continue
            }
            // 3.进一步遍历 picURLs 的数组， 缓存数值中的图片
            for url in s.picURLs! {
                // 1> 进入组，后续的 block 代码会受 group 监听
                dispatch_group_enter(group)
                
                // 用 sdwebimage 缓存图片 downloadImageWithURL 是 SDWebImage 核心的图像下载函数
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (_, _, _, _, _)  in
                    
                    // 代码执行到此，说明图片已经被缓存完成
                    // 2> 离开组
                    dispatch_group_leave(group)
                })
            }
        }
        
        // 3> 监听群组调度执行
        dispatch_group_notify(group, dispatch_get_main_queue()) {
            // 完成回调
            finished(statuses: list, error: nil)
        }
    }
    
    /// 使用传入的数组，完成网络模型转 Status 数组
    private class func statuses(array:[[String : AnyObject]]) -> [Status]{

        // 定义一个可变的数组
        var arrayM = [Status]()
        // 遍历array
        for dict in array{

            arrayM.append(Status(dict: dict))
        }
        return arrayM
    }
}
